﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication1
{
    /*
     * Cookie 是一小段文本信息，伴随着用户请求和页面在 Web 服务器和浏览器之间传递。
     * Cookie 通常限制为 4096 字节，并且每个站点最多可存储 20 个 Cookie。
     * 如果没有设置 Cookie 的有效期，仍会创建 Cookie，但不会将其存储在用户的硬盘上。
       而会将 Cookie 作为用户会话信息的一部分进行维护。当用户关闭浏览器时，Cookie 便会被丢弃。
    */

    public partial class CookiesTest : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            //Cookies有两种写法
            Response.Cookies["userName"].Value = TextBox1.Text;
            Response.Cookies["userName"].Expires = DateTime.Now.AddDays(1); //Cookies的有效期属性
            Response.Cookies["pwd"].Value = TextBox2.Text;
            Response.Cookies["pwd"].Expires = DateTime.Now.AddDays(1);

            //HttpCookie aCookie = new HttpCookie("userName");
            //aCookie.Value = TextBox1.Text;
            //aCookie.Expires = DateTime.Now.AddDays(1);
            //Response.Cookies.Add(aCookie);

        }

        protected void Button2_Click(object sender, EventArgs e)
        {
            //虽然可以读取 Cookie 的名称和值，但无法读取 Cookie 的到期日期和时间。
            //当浏览器向服务器发送 Cookie 信息时，并不包括有效期信息。
            //（Cookie 的 Expires 属性始终返回值为 0 的日期时间值。）
            //读取Cookies(设置过有效期后只要不超时，关闭浏览器依然存在，直到过期)
            if (Request.Cookies["userName"] != null)
                this.Cookies1.Text = Request.Cookies["userName"].Value;                

            if (Request.Cookies["pwd"] != null)
                this.Cookies2.Text = Request.Cookies["pwd"].Value;
        }

        protected void Button3_Click(object sender, EventArgs e)
        {
            //该技术是创建一个与要删除的 Cookie 同名的新 Cookie，并将该 Cookie 的到期日期设置为早于当前日期的某个日期。
            //当浏览器检查 Cookie 的到期日期时，浏览器便会丢弃这个现已过期的 Cookie。
            HttpCookie ck;
            if (Request.Cookies["userName"] != null)
            {
                ck = new HttpCookie(Request.Cookies["userName"].Name);
                ck.Expires = DateTime.Now.AddDays(-1);
                Response.Cookies.Add(ck);
                this.Cookies1.Text = "no cookies";
            }

            if (Request.Cookies["pwd"] != null)
            {
                ck = new HttpCookie(Request.Cookies["pwd"].Name);
                ck.Expires = DateTime.Now.AddDays(-1);
                Response.Cookies.Add(ck);
                this.Cookies2.Text = "no cookies";
            }
        }

        protected void Button5_Click(object sender, EventArgs e)
        {
            //不设置cookie有效期，关闭浏览器后cookie就失效
            Response.Cookies["userName"].Value = TextBox1.Text;
            Response.Cookies["pwd"].Value = TextBox2.Text;
        }

        protected void Button4_Click(object sender, EventArgs e)
        {
            //不能直接修改 Cookie。
            //更改 Cookie 的过程涉及创建一个具有新值的同名Cookie，然后将其发送到浏览器来覆盖客户端上的旧版本 Cookie。
            HttpCookie ck;
            if (Request.Cookies["userName"] != null)
            {
                ck = new HttpCookie(Request.Cookies["userName"].Name);
                ck.Value = "tttt";
                Response.Cookies.Add(ck);
            }

        }
    }
}